// 对axios进行二次封装
import axios from 'axios'
import { getToken, removeToken, setToken } from '@/utils/token'
import { refreshTokenAPI } from '@/api'
import router from '@/router'
import { Notify } from 'vant'
axios.defaults.baseURL = 'http://geek.itheima.net'
// axios.defaults.baseURL = 'http://toutiao.itheima.net'
// 8秒未请求到数据判断为超时
axios.defaults.timeout = 8000

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  if (config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) { // http状态码: 2xx / 3xx开头
  // 对响应数据做点什么
  return response
}, async function (error) { // 4xx/5xx http状态报错
  console.log(error)
  if (error.response.status === 401) {
    // Notify({
    //   type: 'danger',
    //   message: '身份过期, 请重新登录'
    // })
    // 身份认证失败
    removeToken()
    // 续签方式1  重新登陆
    // router.replace('/login') // 切换路由
    // 续签方式2: 用户无感知 -> 用代码直接刷新一个新的token回来

    const res = await refreshTokenAPI()
    // 保存token到本地
    setToken(res.data.data.token)

    // error.config里请求头还带着错的token, 更新一下
    // error-> 逻辑页面(例如: 不感兴趣接口调用报的错)
    // error.config是不感兴趣相关的参数对象
    error.config.headers.Authorization = 'Bearer ' + res.data.data.token

    // 继续完成上一次未完成的401请求
    return axios(error.config) // 把未完成的请求对象, 再装入回去, 重新发送一次请求
    // 原地新发起的Promise对象, 也要return出去
    // 最开始第一次发起请求的逻辑页面
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations') {
    // 响应状态500有可能是别的接口报错的, 但是这里的if只是为了refresh_token过期准备的
    // 所以需要额外加一个条件
    // refreshToken也过期了
    Notify({
      type: 'danger',
      message: '身份过期, 请重新登录'
    })

    // 删除2个token
    removeToken()
    localStorage.removeItem('refresh_token')

    router.replace({
      path: '/login',
      query: {
        pa: router.currentRoute.fullPath // 登录未遂的当前页面的路由地址, 传给登录页面
      }
    }) // 切换路由
  }
  // 对响应错误做点什么
  return Promise.reject(error) // 所以报错的时候, return给了await一个Promise错误对象, 导致await提取不了
})

export default axios

// ({ url, method, params, data, headers }) => {
//   axios({
//     url,
//     data,
//     params,
//     method,
//     headers
//   })
// }
